﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Atendex.Dominio.ActiveRecord;
using Atendex.Dominio.Interfaces;
using Castle.ActiveRecord.Framework;
using Atendex.Dominio;
using Castle.ActiveRecord.Queries;

namespace Atendex.Infraestrutura.Repositórios
{
    public class RepositorioAtendimento : RepositorioGenerico<IAtendimento>
    {

        public override void Salvar(IAtendimento atendimento)
        {
            if (atendimento.Valido)
                base.Salvar(atendimento);
            else throw new RepositorioException("Tentou-se salvar um atendimento em um estado não válido.");
        }
        

        public override IAtendimento TentaObterPorId(object id)
        {
            try
            {
                return AtendimentoAR.TryFind(id);
            }
            catch (ActiveRecordException e)
            {
                throw new RepositorioException("Houve um erro no acesso aos dados", e);
            }
        }

        public override IAtendimento[] ObtemTodosNaoAtivos()
        {
            try
            {
                return AtendimentoAR.FindAll();
            }
            catch (ActiveRecordException e)
            {
                throw new RepositorioException("Houve um erro no acesso aos dados", e);
            }
        }

        public IEnumerable<IAtendimento> ObtemAtendimentosPendentes(string nomeAtendente, DateTime aberturaInicio, DateTime aberturaFim, DateTime prazoInicio, DateTime prazoFim)
        {
            DateTime aberturaFimAjustado = aberturaFim.AddDays(1).AddSeconds(-1);
            DateTime prazoFimAjustado = prazoFim.AddDays(1).AddSeconds(-1);
            var query = new SimpleQuery<AtendimentoAR>(
                @"from AtendimentoAR a 
                    join fetch a.Atendente 
                    where a.Atendente.Nome = ? 
                        and a.DataInicio between ? and ? 
                        and a.DataFim between ? and ? 
                        and a.Status = ?",
                nomeAtendente, aberturaInicio, aberturaFimAjustado, prazoInicio, prazoFimAjustado, StatusAtendimento.Pendente);
            return query.Execute();
        }

        protected override Type ImpType
        {
            get { return typeof(AtendimentoAR); }
        }
    }
}
